package com.yuw.control.userinfo;

import com.yuw.bean.userinfo.UserInfoBean;
import com.yuw.service.userinfo.IUserInfoService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class UserinfoControl {

    // 依赖注入
    @Autowired
    //@Resource
    //private UserInfoBean userInfoBean;

    // 依赖注入service层的类
    // 使用了面向接口的编程思想： 声明的类型是接口类型，注入的类型是该接口的实现类类型
    @Resource
    private IUserInfoService userInfoService;


    @RequestMapping("/UserInfoDeleteById")
    public ResponseEntity<Map<String, Object>> deleteUserInfoById(Integer uid) {
        // 调用service进行新增操作
        int i = userInfoService.deleteUserInfoById(uid);
        // 返回的结果集
        Map<String, Object> mapResult = new HashMap<>();
        // 记录结果条数
        mapResult.put("result", i);
        // 记录结果状态
        mapResult.put("msg", i == 1 ? "ok" : "ng");
        return new ResponseEntity<>(mapResult, HttpStatus.OK);
    }

    @RequestMapping("/UserInfoQueryById")
    public ResponseEntity<UserInfoBean> queryUserInfoById(Integer uid) {
        // 调用service进行id查询操作
        UserInfoBean userInfoBean = userInfoService.queryUserInfoById(uid);
        // 返回ajax请求的 entity
        return new ResponseEntity<>(userInfoBean, HttpStatus.OK);
    }

    // 如果controller中的方法返回的是一个 ResponseEntity 类型的结果集，则自动进行ajax响应处理
    @RequestMapping("/UserInfoSave")
    public ResponseEntity<Map<String, Object>> doUserInfoSave(UserInfoBean userInfoBean) {
        // 调用service进行新增操作
        int i = userInfoService.saveOrUpdateUserInfo(userInfoBean);
        // 返回的结果集
        Map<String, Object> mapResult = new HashMap<>();
        // 记录结果条数
        mapResult.put("result", i);
        // 记录结果状态
        mapResult.put("msg", i == 1 ? "ok" : "ng");
        return new ResponseEntity<>(mapResult, HttpStatus.OK);
    }

    // 使用 ResponseBody注解 + 返回结果集的方式是 springboot进行ajax响应的 一种方式
    @ResponseBody // 标识 该方法的返回值不是视图名，不要进行视图解析，而是将返回的集合对象转换为json字符串
    // servlet中使用的是 fastjson 第三方的插件完成， 在springboot框架下，该框架会自动完成数据结果集向json字符串的转换，
    // 此处方法只需要 返回需要转换的 结果集即可
    @RequestMapping("/UserinfoQuery")
    public List<UserInfoBean> doUserInfoQuery(UserInfoBean userInfoBean) {
        System.out.println("查询参数对象：" + userInfoBean);
        // 返回结果集
        List<UserInfoBean> lstUsers = userInfoService.queryUserInfoByParams(userInfoBean);

        return lstUsers;
    }

    @RequestMapping("/login")
    public String doLogin(@RequestParam("username") String userName, @RequestParam("userpsw") String userPsw) {

//        System.out.println("springmvc框架进行数据类型转换之后：");
//        System.out.println(userName);

        // 调用model层进行业务逻辑处理
        boolean isLogined = userInfoService.doLogin(userName, userPsw);
        // 根据结果进行view的控制转发
        if (isLogined) {
            // 登陆成功
            return "logined/main";
        } else {
            return "index";
        }
    }

    @RequestMapping("/login2")
    public ModelAndView doLogin2(UserInfoBean userInfoBean) {

//        System.out.println("springmvc框架进行数据类型转换之后：");
//        System.out.println(userInfoBean);
        // 创建 返回值对象 ModelAndView
        /*
        ModelAndView 是springmvc提供的用于映射view视图层和数据缓存模块medel的
        ModelAndView 中可以使用model进行数据缓存【缓存级别：request 级别】；view适用于映射视图对象的
         */

        // 返回值
        ModelAndView mav = new ModelAndView();
        // 调用model层进行业务逻辑处理
        boolean isLogined = userInfoService.doLogin(userInfoBean);
        // 根据结果进行view的控制转发
        if (isLogined) {
            // 登陆成功
            // 缓存数据，使用medel进行数据缓存
            mav.addObject("loginedName", userInfoBean.getUsername()); // request级别的缓存
            // 等价于 servlet中web开发的  request.setAttribute("arrname",value);
            // 设置视图名
            mav.setViewName("logined/main");
        } else {
            // 设置视图名
            mav.setViewName("index");
        }
        return mav;
    }
}
